﻿package artin.A3D7.main {

	// 导入使用到的类
	import flash.display.Sprite;// 2D容器
	import flash.display.StageAlign;// 舞台对齐方式
	import flash.display.StageScaleMode;// 舞台缩放方式
	import flash.events.Event;// 事件
	import alternativa.engine3d.core.Camera3D;// 摄像头
	import alternativa.engine3d.core.Object3DContainer;// 3D容器
	import alternativa.engine3d.core.View;// 视窗
	import alternativa.engine3d.materials.FillMaterial; // 材质
	import alternativa.engine3d.objects.Mesh; // 空间模型
	import alternativa.engine3d.core.Vertex; // 顶点
	import alternativa.engine3d.controllers.SimpleObjectController; // 对象控制器
	import artin.A3D7.basemodel.Polygon;
	
	[SWF(backgroundColor="#000000", frameRate="100", width="800", height="600")]
	// A3D 自定义平面扩展类demo
	public class PolygonTest extends Sprite {
		
		private var scene:Object3DContainer;// 创建一个3D容器作为场景
		private var camera:Camera3D;// 摄像头
		
		private var customContainer:Object3DContainer; // 自定义模型容器
		
		private var objectController:SimpleObjectController; // 对象控制器

		// 构造函数
		public function PolygonTest() {

			init2D();// 初始化2D
			init3D();// 初始化3D
			addObject3D();// 添加3D对象

		}

		// 初始化2D
		public function init2D():void {
			stage.align = StageAlign.TOP_LEFT;// 舞台对齐方式为左上角
			stage.scaleMode = StageScaleMode.NO_SCALE;// 舞台缩放方式为不缩放
		}

		// 初始化3D
		public function init3D():void {

			// 创建一个3D容器作为3D场景
			scene = new Object3DContainer();
			
			// 将自定义模型容器添加到3D场景中
			customContainer = new Object3DContainer();
			scene.addChild(customContainer);

			// 添加 摄像头 到3D场景
			camera = new Camera3D();
			camera.z = -1500;
			scene.addChild(camera);

			// 添加 视窗
			camera.view = new View(stage.stageWidth,stage.stageHeight);
			addChild(camera.view);
			
			// 显示调试信息
			addChild(camera.diagram);
			
			// 对象控制器
			objectController = new SimpleObjectController(stage, customContainer,100);
			
			// 添加侦听器：每帧渲染
			stage.addEventListener(Event.ENTER_FRAME, onRender);

		}

		// 每帧渲染
		private function onRender(render:Event):void {

			// 调整视窗大小
			camera.view.width = stage.stageWidth;
			camera.view.height = stage.stageHeight;

			// 控制器
			objectController.update();
			// 渲染
			camera.render();
		}

		// 添加3D对象
		private function addObject3D():void {
			
			/**
			*
			* Polygon
			* 自定义平面类 - 正多边形*圆*星形
			* @ by ssnangua
			*
			* 参数
			*
			* 边数		num		 :uint		= 3
			* 半径1		radius1	 :Number	= 200
			* 半径2		radius2	 :Number	= 0
			* 双面		twoSided :Boolean	= true
			* 反面		reverse	 :Boolean	= false
			* 底面材质	bottom	 :Material	= null
			* 顶面材质	top		 :Material	= null
			*
			*/
			
			// 材质
			var materialR:FillMaterial = new FillMaterial(0xFF0000,1,0,1); // 红色
			var materialB:FillMaterial = new FillMaterial(0x0000FF,1,0,1); // 蓝色
			var materialG:FillMaterial = new FillMaterial(0x00FF00,1,0,1); // 绿色
			
			// 正三角形平面
			var triangle:Polygon = new Polygon(); // 三角形平面模型
			triangle.setMaterialToAllFaces(materialR);
			customContainer.addChild(triangle);
			triangle.x = -400;
			triangle.y = -400;
			// 半径1和半径2的值不同，可以创建等腰三角形
			
			// 正方形平面
			var square:Polygon = new Polygon(4); // 正方形平面模型
			square.setMaterialToAllFaces(materialB);
			customContainer.addChild(square);
			square.x = -400;
			square.y = 400;
			// 半径1和半径2的值不同，可以创建菱形
			
			// 正多边形
			var polygon:Polygon = new Polygon(6,200,200,true,false,materialB,materialR);
			customContainer.addChild(polygon);
			polygon.x = 400;
			polygon.y = -400;
			// 半径1和半径2的值不同，可以创建轴对称多边形
			
			// 圆形
			var circle:Polygon = new Polygon(36,150);
			circle.setMaterialToAllFaces(materialG);
			customContainer.addChild(circle);
			
			// 星形
			var star:Polygon = new Polygon(10,200,80,true,false,materialR,materialB);
			customContainer.addChild(star);
			star.x = 400;
			star.y = 400;
		}

	}
}